<?php namespace Common\Model;
use Hdphp\Model\Model;
//分类模型表
class Cate extends Model{
	//指定模型操作的表
	protected $table = 'category';
	//自动验证要通过create方法来触发
	//限定字段条件,全部写入error模板,一旦有错就会触发
	protected $validate = array(
	//1.字段名,
	//2.规则(见手册),
	//3.提示信息
	//4.验证条件(3是必须验证)
	//5.验证时机(3是插入和修改都要验证)
	
	array('cname','required','分类名称不能为空',3,3),
	array('cname','maxlen:20','分类名称不得超过20个字符',3,3),
	array('ctitle','required','分类标题不能为空',3,3),
	);
	//自定义添加方法
	public function store(){
		//模型自带方法,可以让$this->data有值
		//create触发自动验证
		if($this->create()){
			//模型自带方法,add添加的时候需要从$this->data获得值
		    //先create执行再add添加
		    //添加方法会返回主键自增id
		    $this->add();
			//如果添加正确就返回一个值,输出成功提示
			return true;
		}
		//如果添加错误就返回一个错误的提示
		return false;
	}
	public function edit(){
		//create自动触发验证,通过rerun返回值判断验证
		if($this->create()){
			//修改(不用写where条件的原因是因为edit.php页面有一个隐藏域)
		    $this->save();
			//如果添加正确就返回一个值,输出成功提示
			return true;
		}
		//如果添加错误就返回一个错误的提示
		return false;	
	}
	//获得所有的分类,但是排除自己和自己的子级
	public function getNoMy($cid){
		//在模型目录里面所以不用加model
		//(1)获得自己和自己的子级的cid
		$data = $this->get();
		//$temp是自己的所有子级,返回一个值
		$cids = $this->getSon($data, $cid);
		//压入自己
		$cids[] = $cid;
		//(2)排除
		//SELECT * FROM category WHERE cid NOT IN(自己和自己的子级)
		$result = $this->where("cid NOT IN(". implode(',', $cids) .")")->get();
		$result = Data::tree($result,'cname');
		return $result;
	}
	public function getSon($data,$cid){
		//设置一个空数组来存放所有子级
		$temp = array();
		foreach($data as $v){
			//如果找到自己的子级
			if($v['pid'] == $cid){
				//把子级cid压入到数组
				$temp[] = $v['cid'];
				//再次传入,再次寻找自己(使用递归)
				$temp = array_merge($temp,$this->getSon($data,$v['cid']));
			}
		}
        return $temp;
	}
	//删除
	public function del($cid){
		//1.判断分类下面是否有文章.如果有不能直接删除
		$arcModel = new \Common\Model\Arc;
		//查询分类表里面是否有文章
		$arcData = $arcModel->where("category_cid={$cid}")->find();
		if($arcData){
			//压入到错误属性,将来就可以在控制器用$this->model->getError()方法
			$this->error ='请先删除该分类下面的文章';
			return false;
		}
		//(1)获得要删除分类的pid
		//pluck 指定的字段
		$pid = $this->where("cid={$cid}")->pluck('pid');
		//(2)找到要删除分类的所有子级,然后改变pid
		   //save是修改,有条件的时候才传参
		$this->where("pid={$cid}")->save(array('pid'=>$pid));
		//(3)最后删除当前分类
		$this->where(array('cid'=>$cid))->delete;
	    return true;
	}
}












 ?>